/*************************************************************************
*File Name: isocket.h
*Author: 侯广臣
*2801059691@qq.com
*Created Time: Mon 18 Jan 2021 10:37:22 AM CST
 ************************************************************************/

#ifndef _ISOCKET_H_
#define _ISOCKET_H_
#include <stdio.h>
#include <string.h>

#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#include "idebug.h"

class C_ListenSocket
{
    private:
        int                 m_sockfd;           //监听套接字
        struct sockaddr_in  m_clientAddr;       //连接客户端地址信息
        socklen_t           m_clientAddrLength; //客户端地址结构体长度
    public:
        //默认构造函数，之后需要再调用Init()
        C_ListenSocket() :m_sockfd(-1){  }

        //backlog:监听队列长度
        C_ListenSocket(int backlog, const char *ip = nullptr, int port = 80);

        //析构函数，回收资源
        ~C_ListenSocket()
        {
            if(m_sockfd != -1)
            {
                close(m_sockfd);
            }
        }

        //初始化套接字m_sockfd，如果m_sockfd不为-1那么关闭它，错误返回-1，正确返回套接字
        int Init(int backlog, const char *ip = nullptr, int port = 80);

        //返回已经连接的客户端套接字
        int Accept(void);

        //向字符串buf中写入当前连接客户端的信息IP地址，port端口信息。成功返回buf指针，失败nullptr
        char* GetClientInfo(char buffer[], int bufferLen);

        //返回m_sockfd
        int GetSockfd(void)
        {
            return m_sockfd;
        }
};

#endif
